// 实现大对象深度对比

// 方法一：递归比较
/**
 *  首先，检查两个对象是否为同一引用，如果是，则认为它们相等。
    接着，检查对象是否为非对象或 null，如果是，则认为它们不相等。
    然后，比较两个对象的键的数量，如果不同，它们不相等。
    最后，递归比较每个键对应的值，如果有一个键的值不相等，它们不相等。
 * @param {*} params1 
 * @param {*} params2 
 * @returns bollean
 */
function deepEqual(params1, params2) {
  if (params1 === params2) {
    return true;
  }
  // 检查对象是否为非对象或 null，如果是，则认为它们不相等。
  if (
    typeof params1 !== "object" ||
    typeof params1 === null ||
    typeof params2 !== "object" ||
    typeof params2 === null
  ) {
    return false;
  }
  // 获取对象的键列表
  const keys1 = Object.keys(params1);
  const keys2 = Object.keys(params2);
  //   对象的长度不相等，直接就是不相等
  if (keys1.length !== keys2.length) {
    return false;
  }
  for (let key of keys1) {
    if (!keys2.includes(key) || !deepEqual(params1[key], params2[key])) {
      return false;
    }
  }
  return true
}


// 这种方法的缺点是无法处理函数、undefined、Symbol 等特殊值，因为 JSON.stringify 会将它们转换为 null 或忽略。
function deepEqualWithJSON(obj1, obj2) {
    const str1 = JSON.stringify(obj1);
    const str2 = JSON.stringify(obj2);
    return str1 === str2;
}
  
  // 示例使用
  const objA = {
    a: 1,
    b: {
      c: 2,
      d: [3, 4]
    }
  };
  const objB = {
    a: 1,
    b: {
      c: 2,
      d: [3, 4]
    }
  };
  console.log(deepEqualWithJSON(objA, objB)); // true